package com.rightrule.utils.Impl;


import com.rightrule.utils.BizLockTypeEnum;
import com.rightrule.utils.LockCallBack;
import com.rightrule.utils.LockTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;

import javax.annotation.Resource;

// TODO 代办事项
// TODO 1,集成reids 2，集成定时任务，3，完成异步命令框架，4，手写基于redis的分布式锁引入本项目
// TODO 5，手写基于redis的限流组件引入本项目，6，完成流程平台部分代码并且验证成功。



@Component
public class LockTemplateImpl implements LockTemplate {
    // todo 可根据数据库配置文件名进行指定注入
    @Resource
    private TransactionTemplate transactionTemplate;


    @Override
    public <T> T execute(String bizNo, BizLockTypeEnum lockType, LockCallBack<T> action) {
        return transactionTemplate.execute(new TransactionCallback<T>() {
            @Override
            public T doInTransaction(TransactionStatus status) {
                try {
                    // 开启事务，先加锁表的for update记录，通过bizNo查询
                    // 如果为空,则通过bizNo插入
                    // 再通过bizNo for update,再为空则抛异常
                } catch (Throwable e) {

                }
                // 锁内执行业务逻辑
                return action.doInLock();
            }
        });
    }
}
